home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / ai.s < prev    next >
Text File  |  1997-01-31  |  7KB  |  424 lines

  1. Aggression: dc.w 0
  2. Movement: dc.w 0
  3. Cooperation: dc.w 0
  4. GunType: dc.w 0
  5. Ident: dc.w 0
  6. friends: dc.l 0
  7. enemies: dc.l 0
  8. numfriends: dc.w 0
  9. numenemies: dc.w 0
  10. disttofriend: dc.l 0
  11. disttoenemy: dc.l 0
  12. closefriend: dc.l 0
  13. closeenemy: dc.l 0
  14. Armed: dc.w 0
  15.  
  16. VisibleTab: ds.l 100
  17.  
  18. AIControl:
  19.  
  20. ; First need to see if any enemy are
  21. ; visible, so make a list of which
  22. ; objects are visible to this
  23. ; particular creature.
  24.  
  25.  move.l #ObjectData,a1
  26.  move.l #VisibleTab,a2
  27.  move.l #ZoneAdds,a3
  28.  move.w 12(a0),d0
  29.  move.l (a3,d0.w*4),FromRoom
  30.  move.w (a0),d0
  31.  move.l #ObjectPoints,a4
  32.  move.w (a4,d0.w*8),oldx
  33.  move.w 4(a4,d0.w*8),oldz
  34.  
  35.  move.l #$7fffffff,d0
  36.  move.l d0,disttofriend
  37.  move.l d0,disttoenemy
  38.  move.w #1,numfriends
  39.  move.w #0,numenemies
  40.  
  41. BuildVisibleList:
  42.  tst.w (a1)
  43.  blt BuiltList
  44.  clr.b (a2)
  45.  cmp.l a1,a0
  46.  beq myself
  47.  
  48.  tst.b 16(a1)
  49.  blt myself
  50.  move.b Ident,d0
  51. ; cmp.b 16(a1),d0
  52. ; beq myself
  53.  move.w 12(a1),d0
  54.  blt notvisible
  55.  move.l (a3,d0.w*4),ToRoom
  56.  move.w (a1),d0
  57.  move.w (a4,d0.w*8),newx
  58.  move.w 4(a4,d0.w*8),newz
  59.  movem.l a0/a1/a2/a3/a4,-(a7)
  60.  jsr CanItBeSeen
  61.  movem.l (a7)+,a0/a1/a2/a3/a4
  62.  move.b CanSee,(a2)
  63.  beq.s notvisible
  64.  
  65.  move.b 16(a1),d0
  66.  moveq #0,d1
  67.  bset d0,d1
  68.  move.l d1,d0
  69.  and.l friends(pc),d0
  70.  beq.s notafriend
  71.  addq.w #1,numfriends
  72.  move.w xdiff,d0
  73.  move.w zdiff,d1
  74.  muls d0,d0
  75.  muls d1,d1
  76.  add.l d0,d1
  77.  cmp.l disttofriend(PC),d1
  78.  bgt.s notclosestfriend
  79.  move.l d1,disttofriend
  80.  move.l a1,closefriend
  81. notclosestfriend:
  82.  
  83.  move.l d1,2(a2)
  84.  bra.s isafriend
  85.  
  86. notafriend:
  87.  and.l enemies(pc),d1
  88.  beq.s notanenemy
  89.  addq.w #1,numenemies
  90.  move.w xdiff,d0
  91.  move.w zdiff,d1
  92.  muls d0,d0
  93.  muls d1,d1
  94.  add.l d0,d1
  95.  cmp.l disttoenemy(PC),d1
  96.  bgt.s notclosestenemy
  97.  move.l d1,disttoenemy
  98.  move.l a1,closeenemy
  99. notclosestenemy:
  100.  
  101.  move.l d1,2(a2)
  102.  
  103. notanenemy:
  104. isafriend:
  105.  
  106. notvisible:
  107.  
  108. myself:
  109.  adda.w #64,a1
  110.  addq #6,a2
  111.  bra BuildVisibleList
  112.  
  113. BuiltList: 
  114.  
  115.  tst.w numenemies
  116.  beq NonCombatant
  117.  
  118. Combatant:
  119.  
  120. * The thing can see some enemies
  121. * so do something about it, depending
  122. * upon aggression, movement and
  123. * cooperation stats.
  124.  
  125.  move.w Aggression,d0
  126.  move.w Movement,d1
  127.  move.w Cooperation,d2
  128.  move.w numenemies,d3
  129.  sub.w numfriends,d3 
  130.  
  131. * What does the thing do?
  132. * If very unaggressive, or 
  133. * outnumbered, head for
  134. * the last place it could see no
  135. * enemy, and shoot if armed.
  136.  
  137. * If medium aggression and not
  138. * outnumbered, run towards and
  139. * attack the enemy (unarmed) or stand
  140. * and shoot (armed)
  141.  
  142. * If very high aggression, run
  143. * towards and attack the enemy, if
  144. * no gun, otherwise move forward
  145. * shooting.
  146.  
  147.  cmp.w #10,d0
  148.  ble CNA
  149.  cmp.w #20,d0
  150.  bgt CA
  151.  tst.w d3
  152.  bgt CNA
  153.  ble CA
  154.  rts
  155.  
  156. CA:
  157.  
  158. ; The thing is combatant and very 
  159. ; aggressive.
  160. ; If it is cooperative it will only
  161. ; attack if alone, otherwise it will
  162. ; follow its leader.
  163.  
  164.  cmp.w #1,numfriends
  165.  ble.s mustattack
  166.  cmp.w #20,d1
  167.  bge CAC
  168. mustattack:
  169.  
  170.  move.l closeenemy,a2
  171.  move.w (a2),d0
  172.  lea (a4,d0.w*8),a1
  173.  move.w (a1),newx
  174.  move.w 4(a1),newz
  175.  move.w maxspd(a0),d2
  176.  muls TempFrames,d2
  177.  
  178.  tst.b Armed
  179.  beq.s .unarmed
  180.  asr.w #1,d2
  181. .unarmed
  182.  move.w d2,speed
  183.  move.w #20,Range
  184.  move.l FromRoom,objroom
  185.  
  186.  movem.l a0/a1/a4,-(a7)
  187.  
  188.  jsr HeadTowardsAng
  189.  jsr MoveObject
  190.  
  191.  movem.l (a7)+,a0/a1/a4
  192.  
  193.  
  194.  move.w (a0),d0
  195.  lea (a4,d0.w*8),a1
  196.  move.w newx,(a1)
  197.  move.w newz,4(a1)
  198.  move.l objroom,a2
  199.  move.w (a2),12(a0)
  200.  
  201.  tst.b Armed
  202.  beq.s .nofire
  203.  
  204.  move.l a0,-(a7)
  205.  
  206.  move.w (a1),tempxoff
  207.  move.w 4(a1),tempzoff
  208.  move.w SinRet(pc),tempxdir
  209.  move.w CosRet(pc),tempzdir
  210.  move.w #3,tempGunNoise
  211.  move.b #0,tempGotBigGun
  212.  move.b #1,tempGunDamage
  213.  move.l objroom,tempRoompt
  214.  bsr pressedfire 
  215.  move.l (a7)+,a0
  216. .nofire:
  217.  
  218.  rts
  219.  
  220. CAC:
  221. ; the thing should stay with its
  222. ; group, but shoot if it is armed.
  223.  
  224.  bsr FollowOthers
  225.  
  226.  tst.b Armed
  227.  beq.s .nofire
  228.  
  229.  move.l a0,-(a7)
  230.  
  231.  move.w (a1),tempxoff
  232.  move.w 4(a1),tempzoff
  233.  move.w SinRet(pc),tempxdir
  234.  move.w CosRet(pc),tempzdir
  235.  move.w #3,tempGunNoise
  236.  move.b #0,tempGotBigGun
  237.  move.b #1,tempGunDamage
  238.  move.l objroom,tempRoompt
  239.  bsr pressedfire 
  240.  move.l (a7)+,a0
  241. .nofire:
  242.  
  243.  rts
  244.  
  245.  
  246. CNA:
  247.  
  248. ; The thing is in a combatant situation
  249. ; but is extremely unaggressive. It
  250. ; should therefore retreat from the
  251. ; enemy unless cooperative enough
  252. ; and there are people around to follow.
  253.  
  254.  cmp.w #1,numfriends
  255.  blt.s mustretreat
  256.  
  257.  cmp.w #10,d2
  258.  bgt.s CNAC
  259.  
  260. mustretreat:
  261.  
  262. ; The thing is combatant but
  263. ; unaggressive, and so should run away,
  264. ; at a speed dependant upon movement.
  265. ; The thing is so unaggressive it will
  266. ; not fire weapons if armed.
  267.  
  268.  move.l closeenemy,a2
  269.  move.w (a2),d0
  270.  lea (a4,d0.w*8),a1
  271.  move.w (a1),newx
  272.  move.w 4(a1),newz
  273.  move.w maxspd(a0),d2
  274.  muls TempFrames,d2
  275.  neg.w d2
  276.  cmp.w #10,d1
  277.  bge.s .topspeed
  278.  tst.w d3
  279.  bgt.s .topspeed
  280.  asr.w #1,d2
  281. .topspeed
  282.  move.w d2,speed
  283.  move.w #20,Range
  284.  move.l FromRoom,objroom
  285.  
  286.  movem.l a0/a1/a4,-(a7)
  287.  
  288.  jsr HeadTowardsAng
  289.  jsr MoveObject
  290.  
  291.  movem.l (a7)+,a0/a1/a4
  292.  
  293.  move.w (a0),d0
  294.  lea (a4,d0.w*8),a1
  295.  move.w newx,(a1)
  296.  move.w newz,4(a1)
  297.  move.l objroom,a2
  298.  move.w (a2),12(a0)
  299.  
  300.  rts
  301.  
  302. CNAC:
  303. ; Combatant, cooperative but unaggressive
  304. ; means it should head in a direction
  305. ; away from the enemy but towards
  306. ; its leader, if there is one.
  307. ; It should also not fire if armed.
  308.  
  309. ; for now use followothers
  310.  
  311.  bra FollowOthers
  312.  
  313.  
  314.  
  315.  tst.b Armed
  316.  beq.s .nofire
  317.  
  318.  move.l a0,-(a7)
  319.  move.w (a1),tempxoff
  320.  move.w 4(a1),tempzoff
  321.  move.w SinRet(pc),tempxdir
  322.  move.w CosRet(pc),tempzdir
  323.  move.w #3,tempGunNoise
  324.  move.b #0,tempGotBigGun
  325.  move.b #1,tempGunDamage
  326.  move.l objroom,tempRoompt
  327.  bsr pressedfire 
  328.  move.l (a7)+,a0
  329. .nofire:
  330.  
  331.  rts
  332.  
  333.  
  334. NonCombatant:
  335.  
  336. ; No enemy is visible so we need
  337. ; to make the creature behave
  338. ; appropriately. This could be
  339. ; staying still and looking around,
  340. ; following noises, or wandering
  341. ; around looking for trouble.
  342.  
  343.  move.w Aggression,d0
  344.  move.w Movement,d1
  345.  move.w Cooperation,d2
  346.  
  347. ; If high cooperation, follow the
  348. ; nearest visible leader or thing of
  349. ; equal status, otherwise
  350. ; behave independantly.
  351.  
  352.  tst.w numfriends
  353.  beq noonetofollow
  354.  cmp.w #10,d2
  355.  bgt FollowOthers
  356.  
  357. noonetofollow:
  358.  
  359.  rts
  360.  
  361. FollowOthers:
  362.  move.l #VisibleTab,a1
  363.  move.l #ObjectData,a3
  364.  
  365.  move.w Lead(a0),d0
  366.  move.w #1000,d7
  367.  
  368. findleader:
  369.  tst.w (a3)
  370.  blt.s nomore
  371.  tst.b (a1)
  372.  beq.s .notvis
  373.  
  374.  move.w Lead(a3),d1
  375.  cmp.w d1,d0
  376.  bgt.s .notgoodenough
  377.  cmp.w d7,d1
  378.  bgt.s .toogood
  379.  
  380.  move.w d1,d7
  381.  move.l a3,a5
  382.  
  383. .toogood
  384. .notgoodenough:
  385.  
  386. .notvis:
  387.  
  388.  adda.w #64,a3
  389.  addq #6,a1
  390.  bra findleader
  391. nomore:
  392.  
  393.  move.l FromRoom,objroom
  394.  move.w d7,d0
  395.  blt noonetofollow
  396.  
  397.  move.w d0,tstlead
  398.  
  399.  move.w (a5),d0
  400.  lea (a4,d0.w*8),a1
  401.  move.w (a1),newx
  402.  move.w 4(a1),newz
  403.  move.w maxspd(a0),d2
  404.  muls TempFrames,d2
  405.  move.w d2,speed
  406.  move.w #100,Range
  407.  
  408.  movem.l a0/a1/a4,-(a7)
  409.  
  410.  jsr HeadTowardsAng
  411.  jsr MoveObject
  412.  
  413.  movem.l (a7)+,a0/a1/a4
  414.  
  415.  move.w (a0),d0
  416.  lea (a4,d0.w*8),a1
  417.  move.w newx,(a1)
  418.  move.w newz,4(a1)
  419.  move.l objroom,a2
  420.  move.w (a2),12(a0)
  421.  
  422.  rts
  423.  
  424. tstlead: dc.w 0